#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int P=1e9+7;
const vector<int> dx={1,-1,0,0},dy={0,0,1,-1};
inline void self_add(int &x,int y){
  if((x+=y)>=P)x-=P;
}
int main(){
  freopen("brick.in","r",stdin);
  freopen("brick.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,k,r=0; cin>>n>>k;
  vector<string> s(n);
  for(auto &i:s)cin>>i;
  if(n<=5){
    for(int S=0;S<1<<n*n;S++)
      if(__builtin_popcount(S)==k){
        bool f=true;
        for(int i=0;i<n*n&&f;i++)
          if(S>>i&1)f&=s[i/n][i%n]=='.';
        if(!f)continue;
        auto ct=[&](int x,int y){return S>>x*n+y&1;};
        vector<vector<bool> > b(n,vector<bool>(n));
        queue<pii> q;
        for(int i=0;i<n;i++)
          for(int j=0;j<n;j++)
            if(s[i][j]=='#')b[i][j]=true,q.emplace(i,j);
        int w=0;
        while(!q.empty()){
          int u,v; tie(u,v)=q.front(),q.pop();
          if(ct(u,v))w++;
          for(int d=0;d<4;d++){
            int x=u+dx[d],y=v+dy[d];
            if(~x&&~y&&x<n&&y<n&&!b[x][y]&&ct(x,y))
              b[x][y]=true,q.emplace(x,y);
          }
        }
        r+=w==k;
      }
  }
  else{
    vector<vector<int> > d(n,vector<int>(n,-1));
    queue<pii> q;
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
        if(s[i][j]=='#')d[i][j]=0,q.emplace(i,j);
    while(!q.empty()){
      int u,v; tie(u,v)=q.front(),q.pop();
      for(int i=0;i<4;i++){
        int x=u+dx[i],y=v+dy[i];
        if(~x&&~y&&x<n&&y<n&&d[x][y]<0)
          d[x][y]=d[u][v]+1,q.emplace(x,y);
      }
    }
    if(k==1){
      for(auto i:d)for(int j:i)r+=j==1;
    }
    else if(k==2){
      int c=0;
      for(auto i:d)for(int j:i)c+=j==1;
      r=(1ll*c*(c-1)>>1)%P;
      for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
          if(d[i][j]==1){
            for(int k=0;k<4;k++){
              int x=i+dx[k],y=j+dy[k];
              if(~x&&~y&&x<n&&y<n&&d[x][y]>1)r++;
            }
          }
    }
    else if(k==3){
      int c=0,sb=0;
      for(auto i:d)for(int j:i)c+=j==1;
      r=(__int128)c*(c-1)*(c-2)/6%P;
      for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
          if(d[i][j]==1){
            vector<pii> v;
            for(int k=0;k<4;k++){
              int x=i+dx[k],y=j+dy[k];
              if(~x&&~y&&x<n&&y<n&&d[x][y])
                if(d[x][y]>1)v.emplace_back(x,y),self_add(r,c-1);
            }
            if(!v.empty()){
              self_add(r,v.size()*(v.size()-1)>>1);
              for(auto e:v){
                int x,y; tie(x,y)=e;
                for(int k=0;k<4;k++){
                  int xx=x+dx[k],yy=y+dy[k];
                  if(~xx&&~yy&&xx<n&&yy<n&&d[xx][yy]){
                    if(d[xx][yy]>1)self_add(r,1);
                    else if(make_pair(i,j)!=make_pair(xx,yy))self_add(sb,1);
                  }
                }
              }
            }
          }
      self_add(r,P-1ll*sb*(P+1>>1)%P);
    }
  }
  cout<<r%P<<endl;
  return 0;
}